﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Net.Mail;

namespace AgendaManager.Service
{
    public class UsuarioDAO : DAOBase
    {
        private const string mailNuevoUsuario = @"
Estimado/a:
Le damos la bienvenida a GoC System, el novedoso sistema que permite la gestión y el seguimiento de sus obras y contactos en cualquier momento y lugar.

A continuación se le indica la información necesaria para el ingreso a este sistema.
Nombre de Usuario: {0}
Contraseña: {1}

Es importante aclarar que su contraseña deberá ser modificada la primera vez que ingrese al sistema, por razones de seguridad y privacidad.

De parte de toda la empresa, se espera que este nuevo programa sea de su agrado y facilite sus tareas diarias.

Cualquier duda, crítica o sugerencia, no dude en comunicarse a través del siguiente correo electrónico: {2}

Lo saluda atentamente, SystemAs.";

        private const string mailRecuperarPassword = @"
Estimado/a:

Hemos recibido una petición para restablecer la contraseña de su usario {0}.

Su nueva contraseña es: {1}

Se le solicitará el cambio de la misma, al ingresar nuevamente al sistema.
Muchas gracias.

Equipo de SystemAs.";

        private const string emailFrom = "system_as@outlook.com";

        public static Usuario LogIn(string user, string password)
        {
            Usuario usuario = new Usuario();
            DataTable dt = new DataTable("Usuario");

            try
            {
                using (SqlConnection con = new SqlConnection(connStr))
                {
                    string query = @"SELECT * FROM Usuario WHERE NombreUsuario = @user AND Password = @password";
                    using (SqlCommand cmd = new SqlCommand(query, con))
                    {
                        con.Open();
                        cmd.Parameters.AddWithValue("@user", user);
                        cmd.Parameters.AddWithValue("@password", password);


                        //Preparo el DataAdapter y DataTable para retornar los datos.
                        SqlDataAdapter da = new SqlDataAdapter();

                        da.SelectCommand = cmd;

                        da.Fill(dt);

                        usuario = LlenarUsuario(dt);
                    }
                }

                return usuario;
            }
            catch (Exception)
            {
                throw;
            }
        }

        private static Usuario LlenarUsuario(DataTable dt)
        {
            Usuario usuario = new Usuario();

            if (dt.Rows.Count > 0)
            {
                PoblarObjetoDesdeDataRow(usuario, dt.Rows[0]);
            }

            return usuario;
        }

        internal static Usuario NuevoUsuario(Usuario usuario)
        {
            try
            {
                if (!CheckIfUserExist(usuario))
                {
                    if (!CheckIfMailExist(usuario))
                    {
                        int usuarioId = GetNextId(usuario);

                        if (usuarioId != 0)
                        {
                            usuario.Id = usuarioId;
                            usuario.Password = System.Web.Security.Membership.GeneratePassword(8, 0);

                            if (CreateEntity(usuario))
                            {
                                System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
                                message.To.Add(usuario.Email);
                                message.Subject = "Bienvenido a GoC System!";
                                message.From = new System.Net.Mail.MailAddress(emailFrom, "SystemAs");

                                string text = string.Format(mailNuevoUsuario, usuario.NombreUsuario, usuario.Password, emailFrom);
                                message.Body = text;

                                SmtpClient smtpClient = new SmtpClient("smtp.live.com", 587);
                                smtpClient.EnableSsl = true;
                                smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                                smtpClient.UseDefaultCredentials = false;
                                smtpClient.Credentials = new System.Net.NetworkCredential("system_as@outlook.com", "q1w2e3r4t5");

                                smtpClient.Send(message);
                                return usuario;
                            }

                            throw new Exception("No se pudo crear el Usuario");
                        }
                        else
                            throw new Exception("No se pudo obtener el siguiente id de la entidad: Usuario");
                    }
                    else
                    {
                        throw new Exception("Ya existe un usuario con el mismo email!");
                    }
                }
                else
                {
                    throw new Exception("Ya existe un usuario con el msimo nombre de usuario!");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private static bool CheckIfMailExist(Usuario usuario)
        {
            DataTable dt = new DataTable("Usuario");

            try
            {
                using (SqlConnection con = new SqlConnection(connStr))
                {
                    string query = @"SELECT * FROM Usuario WHERE Email = @email";
                    using (SqlCommand cmd = new SqlCommand(query, con))
                    {
                        con.Open();
                        cmd.Parameters.AddWithValue("@email", usuario.Email);

                        //Preparo el DataAdapter y DataTable para retornar los datos.
                        SqlDataAdapter da = new SqlDataAdapter();

                        da.SelectCommand = cmd;

                        da.Fill(dt);
                    }
                }

                if (dt.Rows.Count > 0)
                    return true;
                else
                    return false;

            }
            catch (Exception)
            {
                throw;
            }
        }

        private static bool CheckIfUserExist(Usuario usuario)
        {
            DataTable dt = new DataTable("Usuario");

            try
            {
                using (SqlConnection con = new SqlConnection(connStr))
                {
                    string query = @"SELECT * FROM Usuario WHERE NombreUsuario = @user";
                    using (SqlCommand cmd = new SqlCommand(query, con))
                    {
                        con.Open();
                        cmd.Parameters.AddWithValue("@user", usuario.NombreUsuario);

                        //Preparo el DataAdapter y DataTable para retornar los datos.
                        SqlDataAdapter da = new SqlDataAdapter();

                        da.SelectCommand = cmd;

                        da.Fill(dt);
                    }
                }

                if (dt.Rows.Count > 0)
                    return true;
                else
                    return false;

            }
            catch (Exception)
            {
                throw;
            }
        }

        internal static bool RecordarPassword(string email)
        {
            Usuario usuario = new Usuario();
            DataTable dt = new DataTable("Usuario");

            try
            {
                using (SqlConnection con = new SqlConnection(connStr))
                {
                    string query = @"SELECT * FROM Usuario WHERE NombreUsuario = @user OR Email = @user";
                    using (SqlCommand cmd = new SqlCommand(query, con))
                    {
                        con.Open();
                        cmd.Parameters.AddWithValue("@user", email);

                        //Preparo el DataAdapter y DataTable para retornar los datos.
                        SqlDataAdapter da = new SqlDataAdapter();

                        da.SelectCommand = cmd;

                        da.Fill(dt);
                        usuario = LlenarUsuario(dt);
                    }

                    if (usuario.Id != null)
                    {
                        usuario.Password = System.Web.Security.Membership.GeneratePassword(8, 0);
                        usuario.PrimeraVez = true;

                        System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
                        message.To.Add(usuario.Email);
                        message.Subject = "Bienvenido a GoC System!";
                        message.From = new System.Net.Mail.MailAddress(emailFrom, "SystemAs");

                        string text = string.Format(mailRecuperarPassword, usuario.NombreUsuario, usuario.Password, emailFrom);
                        message.Body = text;

                        SmtpClient smtpClient = new SmtpClient("smtp.live.com", 587);
                        smtpClient.EnableSsl = true;
                        smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                        smtpClient.UseDefaultCredentials = false;
                        smtpClient.Credentials = new System.Net.NetworkCredential("system_as@outlook.com", "q1w2e3r4t5");

                        smtpClient.Send(message);

                        if(UpdateEntity(usuario))
                            return true;
                    }
                }

                return false;

            }
            catch (Exception)
            {
                throw;
            }
        }

        internal static bool Update(object dto)
        {
            try
            {
                return DAOBase.UpdateEntity(dto);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}